package com.zang.util;

import com.github.javafaker.Faker;

import java.util.Random;
import java.util.UUID;

public class UUIDUtil {

    /**
     * 获取UUID
     *
     * @return
     */
    public static String getUuid() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 生成随机数
     *
     * @return
     */
    public static String getCode() {
        return new Faker().code().asin().toUpperCase();
    }

    /**
     * 生成邀请码
     */
    public static String getInvitationCode(Integer flag) {
        return getCode() + "#" + flag;
    }

    /**
     * 生成8位随机数字母（大小写）+数字
     * 思路：如果区分大小写的话，那么大写算是一类，小写算是一类，数字算是一类，那么通过
     * Random rand=new Random();这行代码随机生成代表每一类的的生成器。
     * 如果随机产生的值为0，则产生的是数字，
     * 如果随机产生的是1，则代表要产生大写字母，
     * 如果随机产生的值为2，则代表要产生小写字母种类。
     * 这样，每一位产生的种类都是随机的，每一类中具体产生的内容则用另一个
     * 随机生成器来随机生成。循环要生成的长度，即可产生大小写和数字组合的随机数了。
     * 注：这里的字母产生需要先产生ascii码对应的整数型，然后将ascii码对应的整数值
     * 进行转换成对应的字符类型即可。
     *
     * @param len 生成位数
     */
    public static String randomCode(int len) {
        StringBuilder sb = new StringBuilder();
        //随机用以下三个随机生成器
        Random rand = new Random();
        Random randdata = new Random();
        int data = 0;
        for (int i = 0; i < len; i++) {
            int index = rand.nextInt(3);
            //目的是随机选择生成数字，大小写字母
            switch (index) {
                case 0:
                    data = randdata.nextInt(10);//仅仅会生成0~9
                    sb.append(data);
                    break;
                case 1:
                    data = randdata.nextInt(26) + 65;//保证只会产生65~90之间的整数
                    sb.append((char) data);
                    break;
                case 2:
                    data = randdata.nextInt(26) + 97;//保证只会产生97~122之间的整数
                    sb.append((char) data);
                    break;
            }
        }
        return sb.toString();
    }
}
